//启动器，配置
package com.cuijian.demo.config;

import com.cuijian.demo.controller.*;
import com.cuijian.demo.model.LogisticsOrder;
import com.cuijian.demo.model.User;
import com.cuijian.demo.mq.TopicManager;
import com.cuijian.demo.service.RocketMQConsumerService;
import com.jfinal.config.*;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.dialect.MysqlDialect;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.plugin.hikaricp.HikariCpPlugin;
import com.jfinal.server.undertow.UndertowServer;
import com.jfinal.template.Engine;

public class DemoConfig extends JFinalConfig {

    public static void main(String[] args) {
        UndertowServer.start(DemoConfig.class, 8080, true);
    }

    @Override
    public void configConstant(Constants constants) {
        // 开启开发模式，显示详细错误信息
        constants.setDevMode(true);
        constants.setEncoding("UTF-8");
        constants.setJsonDatePattern("yyyy-MM-dd HH:mm:ss");
    }

    @Override
    public void configRoute(Routes routes) {
        // 方法1：手动添加路由（推荐）
        routes.add("/api/user", UserController.class);//不使用
        routes.add("/api/auth", AuthController.class);
        routes.add("/api/order", LogisticsOrderController.class); // 新增物流订单控制器
        routes.add("/api/mq", MQTestController.class); // 新增MQ测试控制器
//        routes.add("/debug", DebugController.class);

        // 方法2：或者使用包扫描（确保包路径正确）
        // routes.scan("com.example.demo.controller.");
    }

    @Override
    public void configEngine(Engine engine) {
        // 前后端分离通常不需要模板引擎
    }

    @Override
    public void configPlugin(Plugins plugins) {
        // 使用HikariCP连接池
        HikariCpPlugin hikariPlugin = new HikariCpPlugin(
                "jdbc:mysql://localhost:3306/jfinal_demo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false",
                "root",
                "199863"  // 请修改为您的数据库密码
        );
        // 配置连接池参数
        hikariPlugin.setMaximumPoolSize(20);
//        hikariPlugin.setMinimumIdle(5);
        hikariPlugin.setMaxLifetime(1800000); // 30分钟
        hikariPlugin.setConnectionTimeout(30000); // 30秒

        plugins.add(hikariPlugin);

        // 配置ActiveRecord插件
        ActiveRecordPlugin arp = new ActiveRecordPlugin(hikariPlugin);
        arp.setDialect(new MysqlDialect());
        arp.setShowSql(true);
        arp.addMapping("user", User.class);
        arp.addMapping("logistics_order", LogisticsOrder.class);

        plugins.add(arp);
        // 初始化RocketMQ
        initRocketMQ();

    }

    @Override
    public void configInterceptor(Interceptors interceptors) {
        interceptors.add(new CorsInterceptor());
        interceptors.add(new ExceptionInterceptor());
//        interceptors.add(new JsonRequestInterceptor()); // 添加JSON请求拦截器
        // 添加全局认证拦截器（可选）
        // interceptors.add(new AuthInterceptor());
    }

    @Override
    public void configHandler(Handlers handlers) {
        // 处理器配置
    }
    /**
     * 初始化RocketMQ
     */
    private void initRocketMQ() {
        try {
            System.out.println("🚀 开始初始化RocketMQ...");

            // 初始化生产者
            RocketMQConfig.getInstance().initProducer();

            // 只有在生产者初始化成功后才初始化消费者
            if (RocketMQConfig.getInstance().isMqEnabled()) {
                // 使用单例模式初始化消费者
                RocketMQConsumerService consumerService = RocketMQConsumerService.getInstance();
                if (consumerService.isRunning()) {
                    System.out.println("✅ RocketMQ Consumer启动成功");
                } else {
                    System.out.println("⚠️ RocketMQ Consumer启动失败，运行在生产者模式");
                }
            } else {
                System.out.println("⚠️ RocketMQ初始化完成 - 运行在降级模式");
            }

            // 打印MQ状态
            System.out.println(RocketMQConfig.getInstance().getMqStatus());

        } catch (Exception e) {
            System.err.println("❌ RocketMQ初始化失败: " + e.getMessage());
            e.printStackTrace();
        }
    }

    @Override
    public void onStop() {
        // 应用停止时关闭RocketMQ
        RocketMQConfig.getInstance().destroy();

        // 关闭消费者服务
        RocketMQConsumerService.getInstance().shutdown();

        System.out.println("🛑 应用已停止，RocketMQ资源已释放");
    }
}